home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 015 / epsilon.arc / VERSIONS.ARC / FILES.E < prev    next >
Text File  |  1986-04-06  |  7KB  |  329 lines

  1. /************************************************************************
  2. * "Epsilon", "EEL" and "Lugaru" are trademarks of Lugaru Software, Ltd. *
  3. *                                    *
  4. *     Copyright (C) 1985 Lugaru Software Ltd.  All rights reserved.    *
  5. *                                    *
  6. * Limited permission is hereby granted to reproduce and modify this    *
  7. * copyrighted material provided that the resulting code is used only in    *
  8. * conjunction with Lugaru products and that this notice is retained in    *
  9. * any such reproduction or modification.                *
  10. ************************************************************************/
  11.  
  12. /*
  13.  *  Modifications copyright (c) 1986 by David Dyer-Bennet
  14.  *  Permission for non-commercial use is hereby granted; all other
  15.  *  rights are reserved.
  16.  *
  17.  *  Modifications by David Dyer-Bennet
  18.  *  Terrabit Software
  19.  *  4242 Minnehaha Ave S
  20.  *  Minneapolis, MN 55406
  21.  *  Sysop of Fido 14/341, The Terraboard, (612) 721-8967 3/12/24 24hrs
  22.  *  (612) 721-8800 NOT 24 hrs!  More like noon to midnight
  23.  */
  24.  
  25. /*
  26.  *  Revision history:
  27.  *
  28.  *      Edit    Date        Who     Description
  29.  *
  30.  *  Version 1.0
  31.  *      0       12-Nov-85   Lugaru  Epsilon Version 3.01
  32.  *      1       6-Apr-86    DD-B    Add support for versions
  33.  */
  34.  
  35. #include "eel.h"
  36. #include "versions.h"
  37.  
  38. /* Ask for a file name and save buffer to that file if one is given. */
  39. command write_file() on cx_tab[CTRL('W')]
  40. {
  41.     char tmp[FNAMELEN];
  42.     
  43.     iter = 0;
  44.     get_file(tmp, "Write file: ");
  45.     if (*tmp) {
  46.         filename = tmp;
  47.         return save_file();
  48.     }
  49.     return 0;
  50. }
  51.  
  52. command copy_to_file()
  53. {
  54.     char tmp[FNAMELEN], orig[FNAMELEN];
  55.     
  56.     iter = 0;
  57.     strcpy(orig,filename);
  58.     get_file(tmp, "Copy to file: ");
  59.     if (tmp[0] != '\0')
  60.         filename = tmp;
  61.     save_file();
  62.     filename = orig;
  63. }
  64.  
  65. command visit_file() on cx_tab[CTRL('V')]
  66. {
  67.     char tmp[FNAMELEN];
  68.     char resp[80];
  69.     
  70.     iter = 0;
  71.     get_file(tmp, "Visit file: ");
  72.     if (tmp[0] == '\0')
  73.         if (!filename)
  74.             return;
  75.         else
  76.             strcpy(tmp, filename);
  77.     if (!has_arg && modified) {        /* buffer need to be saved? */
  78.         get_string(resp, "Save buffer? [y]");
  79.         if (toupper(*resp) != 'N')
  80.             save_file();
  81.         }
  82.     read_file(tmp);
  83. }
  84.  
  85. /* read the specifed file into the current buffer */
  86. read_file(tmp)
  87.     char *tmp;
  88. {
  89.     int err;
  90.  
  91.     filename = tmp;
  92.     err = file_read(filename, strip_returns);
  93.     if (err == 2) {
  94.         zap(bufname);
  95.         modified = 0;
  96.         say("%s: New file.",tmp);
  97.     } else if (err)
  98.         file_error(err, tmp, "read error");
  99. }
  100.  
  101.  
  102. /* user routine to save a file.  used by various other user routines.  Returns
  103.    non-zero and prints message in echo area if some sort of error happened. */
  104. command save_file() on cx_tab[CTRL('S')]
  105. {
  106.     int err;
  107.     
  108.     iter = 0;
  109.     if (!*filename)
  110.         return write_file();
  111.  
  112.     if (vers_edit) {    /* [1] add */
  113.         if (strcmp (filename, vers_name) == 0) {
  114.         /* File is being saved as a versioned file */
  115.         versions_save ();
  116.         }
  117.     }            /* [1] end add */
  118.  
  119.     if (err = file_write(filename, strip_returns))
  120.         file_error(err,filename,"write error");
  121.     else 
  122.         say("%s written.", filename);
  123.  
  124.     return err;
  125. }
  126.  
  127. command change_modified() on reg_tab[ALT('~')]
  128. {
  129.     modified = has_arg? (iter != 0) : !modified;
  130.     iter = 0;
  131. }
  132.  
  133. list_line(inbuffer)    /* insert a line into the buffer list */
  134. char *inbuffer;
  135. {
  136.     char file[FNAMELEN], msg[80];
  137.  
  138.     relative(filename, file);
  139.     sprintf(msg, " %7d %c  %-16s %s\n",
  140.         size(), modified ? '*' : ' ', bufname, file);
  141.     bufname = inbuffer;
  142.     stuff(msg);
  143. }
  144.  
  145. make_buffer_list(all, inbuffer)    /* put buffer list in specified buffer */
  146. char *inbuffer;
  147. {
  148.     char *old = bufname, *s;
  149.     
  150.     create(inbuffer);
  151.     zap(inbuffer);
  152.     s = buffer_list(1);
  153.     do {
  154.         bufname = s;
  155.         if (*filename != '\0')
  156.             list_line(inbuffer);
  157.     } while (s = buffer_list(0));
  158.     if (all) {
  159.         s = buffer_list(1);
  160.         do {
  161.             bufname = s;
  162.             if (*filename == '\0')
  163.                 list_line(inbuffer);
  164.         } while (s = buffer_list(0));
  165.         iter=0;
  166.     }
  167.     bufname = inbuffer;
  168.     point = 0;
  169.     stuff("    Size    Buffer           File\n");
  170.     point = 0;
  171.     bufname = old;
  172. }
  173.  
  174. command list_buffers() on cx_tab[CTRL('B')]
  175. {
  176.     make_buffer_list(has_arg, "help");
  177.     view_buffer("help");
  178. }
  179.  
  180. command save_all_buffers()
  181. {
  182.     char *old = bufname, *s;
  183.     
  184.     s = buffer_list(1);
  185.     do {
  186.         bufname = s;
  187.         if (*filename != '\0' && modified)
  188.             if(save_file()){
  189.                 bufname = old;
  190.                 quick_abort();
  191.             }
  192.     
  193.     } while (s = buffer_list(0));
  194.     bufname = old;
  195. }
  196.  
  197. make_bname(fname, bname) /* build buffer name from file name for find-file */
  198. char *fname, *bname;
  199. {
  200.     int uniq = 1, ok;
  201.     char *from, *to, *oldbuf;
  202.     
  203.     strcpy(bname, get_tail(fname, 0));
  204.     bname[14] = 0;        /* make no long buffer names */
  205.     if (!(to = rindex(bname, '.')) || to == bname)
  206.         to = bname + strlen(bname);
  207.     while (exist(bname)) {
  208.         oldbuf = bufname;
  209.         bufname = bname;
  210.         ok = (size() == 0);
  211.         bufname = oldbuf;
  212.         if (ok) return;
  213.         sprintf(to, "<%d>", uniq++);
  214.     }
  215. }
  216.  
  217. command find_file() on cx_tab[CTRL('F')]
  218. {
  219.     char fname[FNAMELEN];
  220.     
  221.     iter = 0;
  222.     get_file(fname, "Find file: ");
  223.     find_it(fname);
  224. }
  225.  
  226. find_it(fname)    /* find named file (must be in absolute form) */
  227. char *fname;
  228. {
  229.     char bname[FNAMELEN+10], *s, mode[80];
  230.     
  231.     if (fname[0] == '\0' || strcmp(filename, fname) == 0)
  232.         return;
  233.     s = buffer_list(1);
  234.     do {
  235.         bufname = s;
  236.         if (strcmp(filename, fname) == 0) {
  237.             to_buffer(s);
  238.             return;
  239.         }
  240.     } while (s = buffer_list(0));
  241.     make_bname(fname, bname);
  242.     to_buffer(bname);
  243.     if (has_arg) {
  244.         strip_returns = 0;
  245.         make_mode();
  246.     }
  247.     read_file(fname);
  248.     if (*get_extension(fname)) {
  249.         sprintf(mode, "suffix-%s", get_extension(fname) + 1);
  250.         try_calling(mode);
  251.     }
  252. }
  253.  
  254. command count_lines() on cx_tab['l']
  255. {
  256.     int count = 0, here = 0, start = point;
  257.     
  258.     sayput("Counting...");
  259.     point = 0;
  260.     while (nl_forward()) {
  261.         count++;
  262.         if (!here && start < point)
  263.             here = count;
  264.     }
  265.     point = start;
  266.     if (!here)
  267.         here = count + 1;
  268.     say("%d lines, point on line %d.  %d bytes on disk.",
  269.         count + 1, here, size() + (strip_returns ? count : 0));
  270. }
  271.  
  272. command show_point() on cx_tab['=']
  273. {
  274.     say("Column=%d, point=%d, size=%d", current_column(), point, size());
  275. }
  276.  
  277. char prev_byte_name[80];
  278.  
  279. char prev_state[80];
  280.  
  281. command write_state()
  282. {
  283.     char msg[80], fname[80], rel[80], *s;
  284.     int err;
  285.  
  286.     if (!*prev_state) {
  287.         s = lookpath("epsilon.sta");
  288.         strcpy(prev_state, s ? s : "epsilon.sta");
  289.     }
  290.     relative(prev_state, rel);
  291.     sprintf(msg, "Write current state on file [%s]: ", rel);
  292.     get_file(fname, msg);
  293.     if (!*fname)
  294.         strcpy(fname, prev_state);
  295.     if (!*fname)
  296.         return;
  297.     
  298.     do_save_state(fname);
  299.     strcpy(prev_state, fname);
  300.     iter = 0;
  301. }
  302.  
  303. do_save_state(fname)        /* save state in file, aborting on error */
  304. char *fname;
  305. {
  306.     char file[80], rel[80];
  307.     int err;
  308.  
  309.     strcpy(file, fname);
  310.     get_doc();        /* save doc file position too */
  311.     sayput("Writing...");
  312.  
  313.     strcpy(get_extension(file), ".sta");
  314.     relative(file, rel);
  315.     if (err = save_state(file))
  316.         file_error(err, file, "write error");
  317.     else
  318.         say("State saved on %s.", rel);
  319. }
  320.  
  321. command set_line_translate()
  322. {
  323.     strip_returns = (has_arg? (iter != 0) : !strip_returns);
  324.     say(strip_returns ? "Add/remove return characters"
  325.             : "No changes when reading or writing");
  326.     make_mode();
  327.     iter = 1;
  328. }
  329.